#include "../inc/cell.h"

// Cell 构造函数，初始化单元格
Cell::Cell(UI_Object* parent)
{
  // 设置父对象
  this->parent = parent;

  // 创建一个 LVGL 对象作为单元格的容器
  this_object = lv_obj_create(parent->get_lv_obj_t());

  // 禁用滚动功能
  lv_obj_clear_flag(this_object, LV_OBJ_FLAG_SCROLLABLE);

  // 启用点击功能
  lv_obj_add_flag(this_object, LV_OBJ_FLAG_CLICKABLE);

  // 设置单元格的背景颜色（默认状态为白色，按下状态为灰色）
  lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_COLOR_WHITE), LV_PART_MAIN | LV_STATE_DEFAULT);
  lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_COLOR_GRAY_4), LV_PART_MAIN | LV_STATE_PRESSED);

  // 设置背景不透明度为完全不透明
  lv_obj_set_style_bg_opa(this_object, 255, LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置边框宽度为 0
  lv_obj_set_style_border_width(this_object, 0, LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置圆角半径为 0
  lv_obj_set_style_radius(this_object, 0, LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置单元格的高度和宽度
  this->height = THEME_BUTTON_CELL_HEIGHT;  // 使用主题定义的单元格高度
  this->width = parent->get_width();       // 单元格宽度与父对象相同

  // 设置 LVGL 对象的高度和宽度
  lv_obj_set_height(this_object, this->height);
  lv_obj_set_width(this_object, this->width);

  // 创建标题标签对象
  this->title = lv_label_create(this_object);

  // 创建箭头标签对象
  this->arrow = lv_label_create(this_object);

  // 设置箭头标签的位置和文本
  lv_obj_set_pos(this->arrow, this->width - 32, 3);  // 箭头位于单元格右侧
  lv_label_set_text(this->arrow, LV_SYMBOL_RIGHT);   // 设置箭头文本为右箭头符号
}

// 设置单元格的图片
void Cell::set_img(const void* src)
{
  // 创建图片对象
  this->img = lv_img_create(this_object);

  // 设置图片源
  lv_img_set_src(this->img, src);

  // 设置图片位置
  lv_obj_set_pos(this->img, -4, -4);  // 图片向左上方偏移 4 像素
}

// 设置单元格的文本
void Cell::set_text(const char* text)
{
  // 设置标题标签的文本
  lv_label_set_text(this->title, text);

  // 设置标题标签的位置
  lv_obj_set_pos(this->title, 38, 3);  // 标题位于单元格左侧，距离左边 38 像素
}

// 设置单元格文本的字体
void Cell::set_font(const lv_font_t* value)
{
  // 初始化字体样式
  lv_style_init(&font_style);

  // 设置字体样式的字体
  lv_style_set_text_font(&font_style, value);

  // 将字体样式应用到标题标签
  lv_obj_add_style(this->title, &font_style, 0);
}

// 设置单元格的点击事件回调函数
void Cell::set_click_event_cb(click_event_cb_t click_event_cb, void* user_data)
{
  // 保存点击事件回调函数和用户数据
  this->click_event_cb = click_event_cb;
  this->click_event_cb_user_data = user_data;

  // 添加点击事件回调
  lv_obj_add_event_cb(this_object, [](lv_event_t* e) {
    // 获取用户数据（即 Cell 对象的指针）
    Cell* cell = (Cell*) e->user_data;

    // 调用点击事件回调函数
    cell->click_event_cb(cell->click_event_cb_user_data);
  }, LV_EVENT_CLICKED, this);  // 监听 LV_EVENT_CLICKED 事件，并将 this 作为用户数据传递
}

// Cell 析构函数
Cell::~Cell()
{
  // 析构函数内容为空
}